#include "adc_ext.h"

/**
 * @brief 不使用DMA进行数据传输时的ADC配置
 * 		由于ADC 规则组数据寄存器 ADC_DR 只有一个，是一个 32 位的寄存器，
 * 		只有低 16 位有效并且只是用于独立模式存放转换完成数据。
 * 		如果使用多通道转换，那转换的数据就全部都挤在了 DR 里面，前一个时间点转换的通道数据，
 * 		就会被下一个时间点的另外一个通道转换的数据覆盖掉，所以当通道转换完成后就应该把数据取走。
 * 		因此不使用DMA模式的时候，每次只能读取一个通道的数据
 * @param adcNum ADC的外设编号，ADC1~3 -> 1~3
 * @param channel ADC的采样通道 0~15
 */
void ADC_Config_NotUseDMA(uint8_t adcNum, uint8_t channel)
{

}


/**
 * @brief 使用DMA进行数据传输时的ADC配置
 *      注意规则通道配置需要根据实际项目进行调整，通过传入函数指针实现自定义配置
 * @param adcNum ADC的外设标号：1~3
 * @param channel 采样的通道数量
 * @param adcRankChanConfig 规则通道配置函数指针
 */
void ADC_Config_UseDMA(uint8_t adcNum, uint8_t channel, void (*adcRankChanConfig)(void))
{

}


/**
 * @brief 使用DMA进行数据传输时的DMA配置
 *      在STM32F103中，ADC1的DMA请求通道是DMA1_Channel1。ADC2没有DMA请求通道。
 *      ADC3的DMA请求仅在大容量产品中存在（DMA2_Channel5）。
 * @param adcNum ADC的外设标号：1~3
 */
void ADC_Config_SetDMA(uint8_t adcNum)
{

}


/**
 * @brief 不使用DMA传输时，获取ADC的采样数据
 * @param channel: ADC的采样通道
 * @return ADC的单次采样结果
 */
uint16_t ADC_GetData_NotUseDMA(uint8_t adcNum, uint8_t channel)
{

}


/**
 * @brief 不使用DMA传输时，获取ADC采样数据的平均值
 * @param channel: ADC的采样通道
 * @param count: 计算平均值的采样数量
 * @return ADC的单次采样结果的平均值
 */
uint16_t ADC_GetAverageData_NotUseDMA(uint8_t adcNum, uint8_t channel, uint16_t count)
{
//    uint32_t temp_val = 0;
//
//    for (uint16_t t = 0; t < count; t++)
//    {
//        temp_val += ADC_GetData_NotUseDMA(adcNum, channel);
//    }
//
//    return temp_val / count;
}

/**
 * @brief 获取通过DMA传输的采样数据
 * @param channel: ADC的采样通道
 * @return ADC的采样数据
 */
uint16_t ADC_GetData_UseDMA(uint8_t channel)
{
//  return Adc_Dma_Buffer_P[0][channel];
    // 注意二维数组与一维指针的数据转换
    return Adc_Dma_Buffer_P[Adc_Dma_ChannelNum*0 + channel];
}


/**
 * @brief 获取通过DMA传输的采样数据（求平均值，过采样）
 * @param channel: ADC的采样通道
 * @return ADC的采样数据
 */
uint16_t ADC_GetAverageData_UseDMA(uint8_t channel)
{
    uint32_t sum = 0;

    for (uint16_t j = 0; j < Adc_Dma_ChannelDeepth; j++)
    {
//      sum += Adc_Dma_Buffer_P[j][channel];
        // 注意二维数组与一维指针的数据转换
        sum += Adc_Dma_Buffer_P[Adc_Dma_ChannelNum*j + channel];
    }

    return sum / Adc_Dma_ChannelDeepth;                     //求平均值并转换成电压值
}
